#!/usr/bin/env node

const { spawn } = require('child_process');
const { execSync } = require('child_process');

// 启动服务器
function startServer() {
  return new Promise((resolve, reject) => {
    console.log('启动测试服务器...');
    
    // 使用cross-env设置环境变量并启动服务器
    const server = spawn('npm', ['run', 'dev'], {
      stdio: 'pipe',
      shell: true
    });
    
    let serverStarted = false;
    
    server.stdout.on('data', (data) => {
      const output = data.toString();
      console.log(`服务器输出: ${output}`);
      
      // 检查服务器是否已启动
      if (output.includes('服务器运行在') && !serverStarted) {
        serverStarted = true;
        console.log('测试服务器已启动');
        setTimeout(() => {
          resolve(server);
        }, 2000); // 额外等待2秒确保服务器完全启动
      }
    });
    
    server.stderr.on('data', (data) => {
      console.error(`服务器错误: ${data.toString()}`);
    });
    
    server.on('error', (error) => {
      console.error(`启动服务器失败: ${error.message}`);
      reject(error);
    });
    
    // 超时处理
    setTimeout(() => {
      if (!serverStarted) {
        console.log('服务器启动超时，但继续执行测试...');
        resolve(server);
      }
    }, 10000);
  });
}

// 运行端到端测试
function runE2ETests() {
  console.log('运行端到端测试...');
  
  try {
    execSync('npm test -- tests/e2e', { 
      stdio: 'inherit',
      cwd: process.cwd()
    });
    console.log('端到端测试完成');
  } catch (error) {
    console.error('端到端测试失败:', error.message);
    process.exit(1);
  }
}

// 主函数
async function main() {
  let server;
  
  try {
    // 启动服务器
    server = await startServer();
    
    // 运行端到端测试
    runE2ETests();
  } catch (error) {
    console.error('执行过程中出错:', error.message);
    process.exit(1);
  } finally {
    // 关闭服务器
    if (server) {
      console.log('关闭测试服务器...');
      server.kill();
    }
  }
}

// 处理程序退出
process.on('SIGINT', () => {
  console.log('\n收到中断信号，正在关闭服务器...');
  process.exit(0);
});

// 运行主函数
main();